package com.java.abstractLearn;

/**
 * @author Lenl
 * @create 2021-05-31 0:52
 *
 * abstract关键字的使用
 * 1.抽象的
 * 2.修饰类、方法
 *
 * 3、修饰类
 *  >此类不能实例化
 *  >抽象类中也要有构造器，便于子类实例化时调用
 *  >开发中都会提供抽象类的子类，让子类实例化完成相关操作
 *
 * 4.修饰方法
 *  >此类只有方法声明，没有方法体
 *  >包含抽象方法的类一定是抽象类，但抽象类不一定有抽象方法
 *  >若子类重写了父类所有抽象方法后，此子类可以实例化，否则它只能是抽象类
 *
 * 注意点：
 *  1.abstract不能修饰属性、构造器等结构
 *  2.abstract不能用来修饰私有方法、静态方法、final方法、final类
 *
 */
public class AbstractTest {
    public static void main(String[] args) {
        //抽象类不可被实例化
        //Person p=new Person();

        method(new Student());//这里是匿名对象

        //抽象类的匿名子类的非匿名对象
        Person p=new Person() {
            @Override
            public void walk() {
                System.out.println("抽象类匿名子类");
            }
        };
        method1(p);
        //匿名子类的匿名对象
        method1(
                new Person() {
                    @Override
                    public void walk() {
                        System.out.println("匿名子类匿名对象");
                    }
                }
        );

    }

    public static void method(Student s){
        s.eat();
        s.walk();
    }

    public  static  void method1(Person p){
        p.eat();
        p.walk();
    }
}

abstract class  Person{
    String name;
    int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat(){
        System.out.println("人：吃饭");
    }
    //抽象方法
    public abstract void walk();
}

class Student extends Person{
    public Student(){

    }

    @Override
    public void walk() {
        System.out.println("学生走上坡路");
    }
}

